package com.snpic.appaw.module.insure.service.cxQuote;

import cn.hutool.core.util.StrUtil;
import com.snpic.appaw.module.insure.dal.dataobject.cxProvince.CxProvinceDO;
import com.snpic.appaw.module.insure.service.orc.ClientOCRService;
import com.snpic.appaw.module.third.api.bjpt.dto.iSPolicyQuery.ISPolicyQueryDetailResDTO;
import com.snpic.appaw.module.third.api.bjpt.dto.iSPolicyQuery.ISRiskDTO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import static com.snpic.appaw.module.insure.enums.InsureConstant.RISKCODE_COMMERCIAL;
import static com.snpic.appaw.module.insure.enums.InsureConstant.RISKCODE_FORCE;

/**
 * @author JiJun
 * @date 2025/9/24 11:10
 * @修改时间 2025/9/24 11:10
 * @description 车险报价服务实现类
 */
@Service
@Slf4j
public class CxQuoteServiceImpl implements CxQuoteService {
	@Resource
	private ClientOCRService clientOCRService;

	/**
	 * 区分以下两种情况:1、当前时间均未晚于商业交强保障截止日期，则取起保日期最早的险别对应的保障时间。
	 * 2、当前时间商业交强如一个晚于保障截止日期，另一个还未晚于保障截止日期，则取未晚于保障截止日期险别对应的保障时间；
	 * 保障时间=系统当前日期-对应险别的保险起期
	 *
	 * @param plateNo
	 */
	@Override
	public Integer getGuaranteedDays(String plateNo) {
		//1. 根据车牌号前缀plateNo_prefix去查询得到机构号和操作员工号(虚拟员工)
		CxProvinceDO cxProvinceDO = clientOCRService.getCxProvinceDO(plateNo);
		//1.2 开始调用，报价平台，历史保单查询
		ISPolicyQueryDetailResDTO isPolicyQueryDetailResDTO = clientOCRService.invokeQueryHisPolicyDetail(cxProvinceDO.getIssueCompany(), cxProvinceDO.getSalesmanCode(), plateNo,null);
		if(isPolicyQueryDetailResDTO == null){
			//价平台，历史保单查询,可能没有查询任何保单,直接返回0
			return 0;
		}
		//1.3 保单险种信息,列表,按起保日期倒序排列取第一个,所以这个列表里面最多只有两条,一条是交强险,一条是商业险
		List<ISRiskDTO> riskList = isPolicyQueryDetailResDTO.getRiskList();
		log.info("车牌{}查询历史保单结果riskList={}",plateNo,riskList);
		//2. 遍历riskList,并计算出days
		//2.1 当前时间
		LocalDateTime now = LocalDateTime.now();
		//2.2 遍历riskList
		//交强险保障日期
		Integer days_force = 0;
		//商业险保障日期
		Integer days_commercial = 0;

		for (ISRiskDTO risk : riskList) {
			//2.2.1 起保日期
			LocalDateTime startDate = risk.getStartDate();
			//2.2.2 终保日期
			LocalDateTime endDate = risk.getEndDate();
			//2.2.3 终保日期,没有过期
			if (now.isBefore(endDate)) {
				//RISKCODE_FORCE是数组,是否包含risk.getRiskCode()
				if (Arrays.asList(RISKCODE_FORCE).contains(risk.getRiskCode())) {
					//交强险天数计算
					days_force = (int) ChronoUnit.DAYS.between(startDate, now);
				} else if (Arrays.asList(RISKCODE_COMMERCIAL).contains(risk.getRiskCode())) {
					// 商业险天数计算
					days_commercial = (int) ChronoUnit.DAYS.between(startDate, now);
				}
			}
		}
		//3. 取days_force和days_commercial中较大的一个
		Integer days = Math.max(days_force, days_commercial);
		return days;
	}
}
